home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 208_01 / tab.c < prev    next >
Text File  |  1987-10-11  |  3KB  |  163 lines

  1.  
  2.  
  3. /*
  4. NAME
  5.     tab
  6. SYSNOPSIS
  7.     tab file ...
  8. NOTE
  9.     the original file will be lost.
  10. AUTHOUR
  11.     Yoshimasa Tsuji
  12. PURPOSE
  13.     spaces are changed into a tab or simply eliminated.
  14.      a tab at column just before a tab column will be replaced with
  15.      a space.
  16. RESTRICTION
  17.     tabbing is only at every eight columns.
  18.  */
  19. #include <stdio.h>
  20. #define TAB '\t'
  21. #define SPACE 040
  22.  
  23. char tmpfile[18];
  24. char tmpname[] = "tabtmp.$$$";
  25. char *infile;
  26. FILE *fopen();
  27. FILE *fi;
  28. char *trimdir();
  29. char *index();
  30.  
  31. int fd;
  32. #define MAXBUF 0x6000
  33. char buff[MAXBUF];
  34. int ptr;
  35.  
  36. main(argc,argv)
  37. char **argv;
  38. {
  39. register int tabpos, scount, tcount, c, onespace;
  40.  
  41. while(--argc) {
  42.     if((fi = fopen(infile = *++argv, "r")) == NULL) {
  43.         fprintf(stderr,"tab: cannot open %s\n", infile);
  44.         continue;
  45.     }
  46.     /* create temporay file */
  47.     strcpy(tmpfile, trimdir(infile));
  48.     strcat(tmpfile, tmpname);
  49.     if((fd = creat(tmpfile,0644)) == -1 ) {
  50.         fprintf(stderr,"tab: cannot create %s\n",tmpfile);
  51.         fclose(fi);
  52.         continue;
  53.     }
  54.     /* copy */
  55.     tabpos = onespace = scount = tcount = 0;
  56.     while((c = fgetc(fi))!= EOF) {
  57.         if(c == TAB) {
  58.             if( tabpos == 7 && scount == 0)
  59.                 onespace = 1;
  60.             else
  61.                 tcount++;
  62.             scount = tabpos = 0;
  63.             continue;
  64.         }
  65.         if(c == SPACE) {
  66.             if(++tabpos == 8) {
  67.                 if(scount == 0)
  68.                     onespace = 1;
  69.                 else  {
  70.                     tcount++;
  71.                     scount = 0;
  72.                 }
  73.                 tabpos = 0;
  74.             }
  75.             else
  76.                 scount++;
  77.             continue;
  78.         }
  79.         if(c == '\n') {
  80.             onespace = tabpos = tcount = scount = 0;
  81.             Putc(c);
  82.             continue;
  83.         }
  84.         /* ordinary */
  85.         if(++tabpos == 8)
  86.             tabpos = 0;
  87.         if(onespace) {
  88.             onespace = 0;
  89.             Putc(SPACE);
  90.         }
  91.         while(tcount) {
  92.             Putc(TAB);
  93.             tcount--;
  94.         }
  95.         while(scount) {
  96.             Putc(' ');
  97.             scount--;
  98.         }
  99.         Putc(c);
  100.     }
  101.     Close();
  102.     if(fclose(fi) == EOF) {
  103.         fprintf(stderr,"tab: cannot close %s\n", infile);
  104.         exit(1);
  105.         }
  106.     if(unlink(infile) == -1)
  107.         fprintf(stderr,"tab: cannot delete %s\n", infile);
  108.     if(rename(tmpfile,infile) == -1)
  109.         fprintf(stderr,"tab: unable to create new %s\n", infile);
  110.   }
  111.   exit(0);
  112. }
  113.  
  114. char *
  115. trimdir(file)
  116. char *file;
  117. {
  118. static char s[6];
  119. char *p, *q;
  120.     s[0] = '\0';
  121.     if(index(file,':') == NULL)
  122.         return s;
  123.     p = file;
  124.     q = s;
  125.         do {
  126.             *q++ = *p;
  127.             if(*p == ':')
  128.                 break;
  129.             p++;
  130.         } while(1);
  131.     *q = 0;
  132.     return s;
  133. }
  134.  
  135. static
  136. Putc(c)
  137.     char c;
  138. {
  139.     buff[ptr] = c;
  140.     if(++ptr == MAXBUF) {
  141.         ptr = 0;
  142.         if(write(fd, buff, MAXBUF) != MAXBUF) {
  143.             fprintf(stderr,"tab: write error on %s\n", tmpfile);
  144.             exit(1);
  145.         }
  146.     }
  147. }
  148.  
  149. static
  150. Close()
  151. {
  152.     if(write(fd, buff, ptr) != ptr) {
  153.         fprintf(stderr,"tab: write error on %s\n", tmpfile);
  154.         exit(1);
  155.     }
  156.     ptr = 0;
  157.     if(close(fd) != 0) {
  158.         fprintf(stderr,"tab: close error on %s\n", tmpfile);
  159.         exit(1);
  160.     }
  161. }
  162.  
  163.